package com.lovi.generics;

import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Test05 {
    public static void main(String[] args) {
        new Test05().test4();

    }
    public void test4(){
        List<AAA> listAAA = new ArrayList<>();
        listAAA.addAll(Arrays.asList(new AAA(), new AAA(),new AAA()));
        List<BBB> listBBB = new ArrayList<>();
        listBBB.addAll(Arrays.asList(new BBB(), new BBB(),new BBB()));
        List<CCC> listCCC = new ArrayList<>();
        listCCC.addAll(Arrays.asList(new CCC(), new CCC(),new CCC()));
        List<DDD> listDDD = new ArrayList<>();
        listDDD.addAll(Arrays.asList(new DDD(), new DDD(),new DDD()));
        //任意类型都ok
        System.out.println("listAAA");
        test1(listAAA);
        test1(listBBB);
        test1(listCCC);
        test1(listDDD);
        //AAA和子类
        test2(listAAA);
        test2(listBBB);
        test2(listCCC);
//        test2(listDDD);//不可以DDD和AAA没关系
        //BBB和父类
        test3(listBBB);
//        test3(listCCC);//不可以，因为不包括子类
        test3(listAAA);
//        test3(listDDD);//不可以，因为DDD和BBB没关系

    }

    public void test1(List<?> list){
        list.forEach(System.out::println);
    }
    //可以传入AAA和它的子类
    public void test2(List<?extends AAA> list){
        list.forEach(System.out::println);
    }
    //可以传入BBB和它的父类，不能是它的子类（如CCC)
    public void test3(List<?super BBB> list){
        list.forEach(System.out::println);
    }

}
class AAA {
    @Override
    public String toString() {
        return "AAA{}";
    }
}
class BBB extends AAA{
    @Override
    public String toString() {
        return "BBB{}";
    }
}
class CCC extends BBB{
    @Override
    public String toString() {
        return "CCC{}";
    }
}
class DDD {
    @Override
    public String toString() {
        return "DDD{}";
    }
}
